//
//  main.c
//  C_13.基本开发技巧
//
//  Created by Robin on 16/3/23.
//  Copyright © 2016年 cnbm. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>

/*十进制转化为十六就只**/
void decimalTohexadecimal (){
    
    int i;
    puts("please input you num:");
    scanf("%i",&i);
    printf("the hex number : %x\n",i);
}

/**N 进制转化为十进制*/
char* trans_str (char *a){
    
    
    for (int i=0; a[i] != '\0'; i++) {
        if (a[i] >= 'a' && a[i] <= 'z' )
            a[i] -= 32;
        
        //puts(a);
    }
    return a;
}


long transToDecimail (int n,char *s){
    long t1=0;
    int i,t=0;
    
    char *str = trans_str(s);
    
    i = 0;
    for (; i < strlen(s); i++) {
        
        if ((str[i]-'0' >= n && str[i] < 'A') || str[i]-'A'+10 >=n) {
            printf("Data Error!");
            exit(1);
        }
        
        if (str[i] >= '0' && str[i] <= '9') {
            t = str[i] - '0';
        }else if (n >= 11 && str[i] - 'A' + 10 < n){
            t = str[i] - 'A' + 10;
        }
        
        t1 = t1*n + t;//324
    }
    
    return t1;
}

// 技巧3 : IP地址形式的输出
// 将二进制转化为十进制
int bin_dec (int x,int n){
    if (n==0)
        return 1;
    return x*bin_dec(x, n-1);
}
// 深入理解二进制
void printf_IP (){
    int i;
    int ip[4]={0};
    char a[33];
    printf ("Please input binary number:\n");
    scanf("%s",a);
    for (i=0; i<8; i++)
    {
        if (a[i]=='1') // 01001100 -> 170
        {
            ip[0] += bin_dec(2,7-i);
        }
    }
    
    for (i=8; i<16; i++)
    {
        if (a[i]=='1')
        {
            ip[1]+=bin_dec(2,15-i);
        }
    }
    
    for (i=16; i<24; i++)
    {
        if (a[i]=='1')
        {
            ip[2]+=bin_dec(2,23-i);
        }
    }
    
    for (i=24; i<32; i++)
    {
        if (a[i]=='1')
        {
            ip[3]+=bin_dec(2,31-i);
        }
        if (a[i]=='\0')
        {
            break;
        }
    }
    printf ("%d.%d.%d.%d\n",ip[0],ip[1],ip[2],ip[3]);
    
    //fprintf(stdin, "%d.%d.%d.%d\n",ip[0],ip[1],ip[2],ip[3]);
    //char *ipstr =
}


// 04 数字由小到大排序
void sortNumber (){
    
    int a,b,c,t;
    printf("Please input your num a b c: \n");
    scanf("%d%d%d",&a,&b,&c);
    
    if (a>b) {
        t=a;
        a=b;
        b=t;
    }
    
    if (a>c) {
        t=a;
        a=c;
        c=t;
    }
    
    if (b>c) {
        t=b;
        b=c;
        c=t;
    }
    
    printf("the order of number is :");
    printf("%d %d %d \n",a,b,c);
}

// 05 阶梯问题
void stairs (){
    
    int i;
    for (i=100; i<1000; i++) {
        if (i%2==1&&i%3==2&&i%5==4&&i%6==5&&i%7==0) {
            printf("the number of stairs is %d\n",i);
        }
    }
}

// 06 计算闰年
void leapyear (){
    int year;
    printf("Please input year:\n");
    scanf("%d",&year);
    if ((year%4==0 && year%100!=0) || year%400==0) {
        printf("this is a leap year");
    }else
        printf("this is not a leap year");
}

// 07 打印九九乘法表
void printBall (){
    
    for (int i=0; i<9; i++) {
        for (int j=0; j<i; j++) {
            printf("%d*%d=%d",i,j,i*j);
        }
        printf("\n");
    }
}

// 08 打印杨辉三角
void printYang (){
    
    int i,j,a[11][11];
    for (i=1; i<11; i++)
    {
        a[i][i]=1;
        a[i][1]=1;
    }
    for (i=3; i<11; i++)
    {
        for (j=2; j<=i-1; j++)
        {
            a[i][j]=a[i-1][j-1]+a[i-1][j];
        }
    }
    for (i=1; i<11; i++)
    {
        for (j=1; j<=i; j++)
            printf ("%4d\t",a[i][j]);
        printf ("\n");
    }
}

int main(int argc, const char * argv[]) {

    //decimalTohexadecimal();
    
//    char a[100];
//    int n;
//    printf("Please input your number string: ");
//    fscanf(stdin, "%s",a);
//    printf("Please input your n(2or8or16): ");
//    fscanf(stdin, "%d",&n);
//    
//    long num = transToDecimail(n, a);
//    printf("num is %ld\n",num);
    
//    printf_IP();
//    sortNumber();
//    stairs();
    //printBall();
    printYang();
    return 0;
}


// int getchar(void) 函数的返回值为用户输入的第一个字符的ASCII码，若出错返回-1，且将用户输入的字符回显到屏幕。如果用户在按回车键之前输入了不只一个字符，其他字符会保留在键盘缓冲区中，等待后续getchar()调用读取。也就是说，后续的getchat()调用不会等待用户按键，而是直接读取缓冲区中的字符，直到缓冲区的字符读取完毕后，才等待用户按键。

